package xin.marcher.module.seller.job;

import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import xin.marcher.module.common.constants.seller.SellerRedisKeyConstants;
import xin.marcher.module.common.redis.RedisCache;
import xin.marcher.module.common.utils.JsonUtil;
import xin.marcher.module.seller.domain.entity.SellerInfoDO;
import xin.marcher.module.seller.repository.SellerRepository;

import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 卖家缓存数据同步
 */
@Slf4j
@Component
public class SellerCacheSyncSchedule {

    @Resource
    private RedisCache redisCache;

    @Resource
    private SellerRepository sellerRepository;

    /**
     * 卖家缓存数据同步定时任务
     * 5分钟执行一次
     * 每次查询出数据库最近5分钟的更新和新增数据，然后同步差异数据到缓存
     */
    @XxlJob("cacheSync")
    public void cacheSync() {
        // 计算出前五分钟的时间
        Date beforeTIme = getBeforeTime();
        // 从数据库中查询出最近5分钟内的数据
        List<SellerInfoDO> sellerInfoList = sellerRepository.querySellerInfoFiveMinute(beforeTIme);
        // 过滤出数据库和缓存中的差异数据，并将差异数据保存到缓存
        saveDiffSellerInfo(sellerInfoList);
    }

    /**
     * 比较数据库和缓存中的差异数据，过滤出差异数据，并将差异数据保存到缓存
     *
     * @param sellerInfoList 卖家信息集合
     */
    private void saveDiffSellerInfo(List<SellerInfoDO> sellerInfoList) {
        sellerInfoList.stream().peek(sellerInfo -> {
            Long sellerId = sellerInfo.getSellerId();
            String redisKey = SellerRedisKeyConstants.SELLER_INFO_LIST + sellerId;
            // 不存在说明是差异数据
            if (!redisCache.hasKey(redisKey)) {
                redisCache.set(redisKey, JsonUtil.object2Json(sellerInfo), -1);
            }
        }).count();
    }

    /**
     * 获取5分钟之前的时间
     *
     * @return 5分钟之前的时间
     */
    private Date getBeforeTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, -5);
        return calendar.getTime();
    }
}
